#ifndef __HLUART_H
#define __HLUART_H

#include "type.h"

typedef struct Element
{
    u8 size;  // data的长度
    u8 type;  // 元素类型
    u32 data; // 元素内容(4字节)

} Element;

// // 获得协议的元素数量
// u16 elements_size();

// // 元素组初始化，根据协议返回buffer字节数量
// u16 elements_init(Element elements[]);

// 读取buffer
void read_buffer(u8 *buffer, u16 length, Element elements[]);

// 写buffer
void write_buffer(u8 *buffer, u16 length, Element elements[]);

// // 通过data获得buffer
// void get_buffer_from_data(u32 data, u8 size, u8 *buffer);

// // 通过buffer获得data
// void get_data_from_buffer(u32 *data, u8 size, u8 *buffer);

// // 通过val获得data
// #define get_data_from_val(val) (__get_data_from_buffer((u8 *)(&(val)), sizeof(val)))

u8 type_get_size(u8 type);
u16 get_elements_length(u8 *buffer, u16 size);
u32 data(void *val, u8 type);
void val(void *val, u8 type, u32 data);
// data快速赋值
#define def_val(x, Type) (*(Type *)(&(x)))

#define set_data(val, type, res)     \
    {                               \
        u32 TEMP_VAL = 0;            \
        if ((type) == T_FLOAT)       \
        {                            \
            f32 v = (val);           \
            TEMP_VAL = *(u32 *)(&v); \
        }                            \
        else if ((type == T_INT16))  \
        {                            \
            i16 v = (val);           \
            TEMP_VAL = *(u32 *)(&v); \
        }                            \
        else if ((type == T_INT32))  \
        {                            \
            i32 v = (val);           \
            TEMP_VAL = *(u32 *)(&v); \
        }                            \
        else if ((type == T_UINT8))  \
        {                            \
            u8 v = (val);            \
            TEMP_VAL = *(u32 *)(&v); \
        }                            \
        else if ((type == T_UINT16)) \
        {                            \
            u16 v = (val);           \
            TEMP_VAL = *(u32 *)(&v); \
        }                            \
        else if ((type == T_UINT32)) \
        {                            \
            u32 v = (val);           \
            TEMP_VAL = *(u32 *)(&v); \
        }                            \
        (res) = TEMP_VAL;            \
    }																\
// 快速给元素赋data
#define element_set_data(e, val) {set_data((val), ((e).type), ((e).data))}

#define element_input(e,t,v)    \
    {                          \
        e.type=t;              \
        e.size = type_get_size(elements[0].type);   \
        element_set_data(e, v); \
    }                          \

		
		
		
		
#endif
